package com.shujia.day09;



public class C04String {
    public static void main(String[] args) {
        /*
            下面两种方式在内存中的存储位置不一样：
                String a = "hello" 是在堆中的常量池中生成了一个"hello" 再将该地址赋予给 栈中的 a
                new String("hello"); 在堆中创建了一个String类型的对象 并将该对象地址赋予给了 栈中的 string
         */
        String a = "hello"; // 注意使用的是java.lang下的String类型 Java自带的
        String string = new String("hello");  // 通过构造方法创建的一个String类型的对象
        System.out.println(a);
        System.out.println(string);

        // 以字节数组创建一个字符串
        byte[] bytes = {97,98,99,100};  // 字节数组保存的数据，转换成字符串 是根据数值在ASC码表中的位置来确定的
        String byteStr = new String(bytes);
        System.out.println(byteStr);

        // public String(byte[] bytes,int offset,int length)  // offset 表示下标的开始位置  length 表示截取的长度
        String someByteStr = new String(bytes, 1, 2);  // 将字节数组中的一部分转换成字符
        System.out.println(someByteStr);


        // public String(char[] value)
        char[] value = {'我','爱','学','j','a','v','a'};
        String charStr = new String(value);
        System.out.println(charStr);

        // public String(char[] value,int offset,int count)  同上byte数组
        String someCharStr = new String(value, 3, 4);
        System.out.println(someCharStr);

        String b = "hello";
        System.out.println(a == b);  // true  在常量池中存储了一个hello 并将该地址赋予给 a 和 b
        String string2 = new String("hello");
        System.out.println(string2 == string);  // 比较内存地址  false
        System.out.println(string2.equals(string)); //获取字符串中的每个字符去判断 true

    }
}
